/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package cbaServer;

import builder.BuilderDirector;
import commonSources.Cliente;
import commonSources.Conta;
import commonSources.Funcionario;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Vector;
import operacoes2.Operacao;

/**
 *
 * @author Rente
 */
public class CBAOperations extends UnicastRemoteObject implements BankServerCBAInterface {

    private BankServer bs;
    // private Object dateFormat;
    private BuilderDirector bd = new BuilderDirector();

    public CBAOperations(BankServer bs) throws RemoteException {
        this.bs = bs;
    }

    public synchronized boolean deposito(String numeroConta, double quantia) {
        Conta c = getConta(numeroConta);
        c.setSaldo(c.getSaldo() + quantia);
        bs.getHandler().saveClientes(bs.getListaClientes());
        return true;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker ">
    // #[regen=yes,id=DCE.5FC8D605-44B8-BBE0-8153-78BAF2590EC6]
    // </editor-fold>
    public synchronized int levantamento(String idConta, double quantia) {
        try {
            Conta c = getConta(idConta);
            if (c.getSaldo() >= quantia) {
                c.setSaldo(c.getSaldo() - quantia);
                bs.getHandler().saveClientes(bs.getListaClientes());
                return 1;
            } else {
                return 0;
            }
        } catch (Exception e) {
            return -1;
        }
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker ">
    // #[regen=yes,id=DCE.5F535B1D-5E1F-980E-C753-1D66F907EB25]
    // </editor-fold>
    public synchronized int pagamentoServico(String idConta, String referencia, double quantia) {
        Conta c = getConta(idConta);
        if (c.getSaldo() >= quantia) {
            c.setSaldo(c.getSaldo() - quantia);
            bs.getHandler().saveClientes(bs.getListaClientes());
            return 1;
        } else {
            return 0;
        }
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker ">
    // #[regen=yes,id=DCE.DED38080-5919-B0DC-BF89-5C003D9E7488]
    // </editor-fold>
    public synchronized int transferencia(String numContaPagador, String numContaDestino, double quantia) {
        System.out.println("TRANSFERENCIA: " + numContaPagador + " para " + numContaDestino);
        Conta pagador = getConta(numContaPagador);
        Conta destino = getConta(numContaDestino);
        if (destino != null) {
            if (pagador.getSaldo() >= quantia) {
                pagador.setSaldo(pagador.getSaldo() - quantia);
                destino.setSaldo(destino.getSaldo() + quantia);
                bs.getHandler().saveClientes(bs.getListaClientes());
                return 1;
            } else {
                return 0;
            }
        } else {
            return 2;
        }
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker ">
    // #[regen=yes,id=DCE.43B9B73E-F9A3-89B5-DB86-5E9CDDBAF721]
    // </editor-fold>
    public synchronized double consultaSaldo(String numConta) {
        if (getConta(numConta) == null) {
            return 1.111;
        } else {
            return getConta(numConta).getSaldo();
        }
    }

    public synchronized boolean mudaPIN(String idConta, String numCartao, String pinNovo) {
        System.out.println(idConta + " " + numCartao + " " + pinNovo);
        try {
            getConta(idConta).getCartao(numCartao).setPIN(pinNovo);

            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    public synchronized Conta getConta(String numeroConta) {
        System.out.println("busco conta: " + numeroConta);
        for (Cliente cliente : bs.getListaClientes().values()) {
            if (cliente.getContas().containsKey(numeroConta)) {
                return cliente.getConta(numeroConta);
            }
        }
        System.out.println("Nao achei... :'(");
        return null;
    }

    public synchronized String autentica(String numCartao, String pinInserido) {
        if (numCartao.startsWith("9")) {
            return autenticaFuncionario(numCartao, pinInserido);
        } else {
            return autenticaCliente(numCartao, pinInserido);
        }
    }

    public synchronized String autenticaCliente(String numCartao, String pinInserido) {
        for (Cliente cliente : bs.getListaClientes().values()) {
            for (Conta conta : cliente.getContas().values()) {
                if (conta.getCartao(numCartao) != null) {
                    if (conta.getCartao(numCartao).getPIN().equals(pinInserido)) {
                        return conta.getNumConta();
                    }
                }
            }
        }
        return null;
    }

    public synchronized Cliente getClienteByNumCard(String numCard){
        for (Cliente cliente : bs.getListaClientes().values()) {
            for (Conta conta : cliente.getContas().values()) {
                if (conta.getCartao(numCard) != null) {
                   return cliente;
                }
            }
        }
        return null;
    }

    private String autenticaFuncionario(String numCartao, String pinInserido) {
        for (Funcionario funcionario : bs.getListaFuncionarios().values()) {
            if (funcionario.getCartao().getNumCartao().equals(numCartao) && funcionario.getCartao().getPIN().equals(pinInserido)) {
                return "funcionario";
            }
        }
        return null;
    }

    public synchronized void guardaOperacoes(Vector<Operacao> operacoes) {
        System.out.println("SALVANDO RESUMO DE OPERAÇÕES");
        if (operacoes.size() > 0) {
            for (Operacao operacao : operacoes) {
                System.out.print(operacao.getClass().getCanonicalName());
                System.out.println(" " + bs.getDateFormat().format(operacao.getData()));
            }

            bd.writeFiles(operacoes);

            /*
            bd.setAbstractBuilder(new BinaryFileBuilder(), operacoes);
            bd.constructFile();

            bs.getHandler().saveFileBuilder(bd.getFileBuilder(), operacoes);

            bd.setAbstractBuilder(new TextFileBuilder(), operacoes);
            bd.constructFile();

            bs.getHandler().saveFileBuilder(bd.getFileBuilder(), operacoes);

            bd.setAbstractBuilder(new XMLFileBuilder(), operacoes);
            bd.constructFile();

            bs.getHandler().saveFileBuilder(bd.getFileBuilder(), operacoes);
            */

            //        bd.setAbstractBuilder(new PDFFileBuilder(), operacoes,fileName);
//        bd.constructFile();
//       bs.getHandler().saveFileBuilder(bd.getFileBuilder(), operacoes);
            //tirar no fim de todos os builders gravarem correctamente
            // bs.getHandler().saveOperacoes(operacoes);
            System.out.println("FINISHED RESUMO DE OPERAÇÕES");
        }
    }

    private String getDateTime() {
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd#HH_mm");
        Date date = new Date();
        return dateFormat.format(date);
    }

    public Cliente getCliente(String id) throws RemoteException {
      return bs.getListaClientes().get(id);
    }

 
}
